package myjava.interfaccie;

public class Root1 {

   public static void main(String[] args) {
      
      BasketBall o = new BasketBall();
      // il programmatore client puo' fare affidamento sul metodo bounce e getRadius
      // perche BasketBall implementa con successo Baunceable (cioe' qualche cosa che rimbarlza e ha un diametro)
      o.bounce();
   }
}

class BasketBall implements Bounceable {

   // you cannot use a weaker access modifier! (protected, private or even DEFAULT!!!)
   // se ci pensi ha senso dato che implementare un interfaccia significa avere un tot di
   // metodi pubblici che codice client puo' usare! E' tale metodi devono appunto essere public
   public int getRadius() {
      return 15;
   }

   public void bounce() {
      // nota che le costanti statiche delle interfaccie vengono ereditate
      System.out.println("boing boing boing ... bouncing is " + BasketBall.BOUNCING_IS);
   }
}

class BasketBallBlue extends BasketBall implements Bounceable {

   // dato che estende BasketBall, che a sua volta implementa gia' Bounceable,
   // BasketBallBlue puo' implementare Bounceable senza definire i metodi dell'interfaccia
   // dato che li eredita appunto dalla base class

}